package gtrnadb;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;

public class Database {
	
	public static final String pageName = "http://gtrnadb.ucsc.edu/";
	public ArrayList<String> geneNames = new ArrayList<String>();
	public ArrayList<GeneStructure> gene = new ArrayList<GeneStructure>();
	
	public Database() {
	}
	
	
	public void parseHtmlNames(String in) {;
		String res[] = in.split("<td");
		if (res.length>1) {
			String res2[] = res[1].split("<a href=\"");
			if (res2.length>1) {
				String res3[] = res2[1].split("/\">");
				if( !(res3[0].contains(".") || res3[0].contains("#")) ) {
					System.out.println(res3[0]);
					geneNames.add(res3[0]);
				}
			}
		}
	}
	
	public void URLConnectionReader() {
		try {
	        URL url = new URL(pageName);
	        URLConnection urlc= url.openConnection();
	        BufferedReader br = new BufferedReader( new InputStreamReader( urlc.getInputStream()));
	        String inputLine;
	
	        int i=0;
	        while ((inputLine = br.readLine()) != null) {
	        	i++;
	        	//System.out.println(i+" "+inputLine);
	        	parseHtmlNames(inputLine);
	        }
	        br.close();
	        int count=0;
	        for (String name : geneNames) {
	        	System.out.println((count++)*100/geneNames.size()+"% "+name);
	        	url = new URL(pageName+name+"/"+name+"-structs.html");
	        	urlc = url.openConnection();
	        	br = new BufferedReader( new InputStreamReader( urlc.getInputStream()));
	        	String nameGene=null, lengthGene=null, typeGene=null, anticodonGene=null, positionStartGene=null, positionEndGene=null, seqGene=null, strGene=null;
	        	while ((inputLine = br.readLine()) != null) {
	        		if (inputLine.contains("<PRE>")) {
	        			while(!inputLine.contains("</PRE>")) {
	        				if (inputLine != null) {
	        					inputLine = inputLine.replaceAll("[ \t]", " ");
	        					inputLine = inputLine.replaceAll("[ ]+", " ");
	        					if (inputLine.contains("Length")) {
	        						/*String firstLine[] = inputLine.split("Length: ");
	        						if (firstLine.length==2) {
		        						nameGene = firstLine[0].split(" ")[0];
		        						lengthGene = firstLine[1].split(" ")[0];
		        						System.out.println(nameGene+" "+lengthGene);
	        						}
	        						else {
	        							System.out.println("Problème dans la récupération des données au niveau de la première ligne "+inputLine);
	        						}*/
	        						String firstLine[] = inputLine.split(" "); // première ligne
				        			if (firstLine.length>=4) {
					        			nameGene = firstLine[0]; // nom du génome
					        			lengthGene = firstLine[3]; // taille du génome
					        			//System.out.println(firstLine[0]+" "+firstLine[3]);
				        			}
				        			else {
			        					System.out.println("Problème dans la récupération des données au niveau de la première ligne "+inputLine);
			        				}
	        					}
	        					else if (inputLine.contains("Type") && inputLine.contains("Anticodon")) {
	        						/*String secondLine[] = inputLine.split("at ");
	        						String position[] = secondLine[1].split(" ");
	        						positionStartGene = position[0].split("-")[0];
	        						positionEndGene = position[0].split("-")[1];
	        						
	        						secondLine = inputLine.split("Anticodon: ");
	        						anticodonGene = secondLine[1].split(" ")[0];
	        						
	        						secondLine = inputLine.split("Type: ");
	        						typeGene = secondLine[1].split(" ")[0];
	        						
	        						System.out.println(typeGene+anticodonGene+positionStartGene+positionEndGene);
	        						
	        						*/
	        						String secondLine[] = inputLine.split(" "); // deuxième ligne
			        				if (secondLine.length>=6) {
				        				typeGene = secondLine[1]; // type du génome
				        				anticodonGene = secondLine[3]; // anticodon du génome
				        				//System.out.println(typeGene+" "+anticodonGene);
				        				String positionTab[] = secondLine[5].split("-");
				        				if (positionTab.length>=2) {
					        				positionStartGene = positionTab[0];
					        				positionEndGene = positionTab[1];
				        					//System.out.println(positionStartGene+" "+positionEndGene);

				        				}
				        				else {
				        					System.out.println("Problème dans la récupération des données au niveau de la position "+inputLine);

				        				}
				     
			        				}
			        				else {
			        					System.out.println("Problème dans la récupération des données au niveau la deuxième ligne "+inputLine);
			        				}
			        			
	        					}
	        					else if (inputLine.contains("Seq")) {
	        						String thirdLine[] = inputLine.split(" "); // troisième ligne
			        				if (thirdLine.length>=2) {
				        				seqGene = thirdLine[1];
				        				//System.out.println(thirdLine[1]);
			        				}
			        				else {
			        					System.out.println("Problème dans la récupération des données au niveau la troisième ligne "+inputLine);
			        				}
	        					}
	        					else if (inputLine.contains("Str")) {
	        						String fourthLine[] = inputLine.split(" ");
			        				if (fourthLine.length>=2) {
				        				strGene = fourthLine[1];
				        				//System.out.println(fourthLine[1]);
			        				}
			        				else {
			        					System.out.println("Problème dans la récupération des données au niveau la quatrième ligne "+inputLine);
			        				}
	        					}
	        					else {
	        						
	        					}
	        					inputLine = br.readLine();
	        				}
	        			}
	        			if (nameGene!=null && lengthGene!=null && typeGene!=null && anticodonGene!=null && positionStartGene!=null && positionEndGene!=null && seqGene!=null && strGene!=null) {
	        				gene.add(new GeneStructure(nameGene, lengthGene, typeGene, anticodonGene, positionStartGene, positionEndGene, seqGene, strGene));
	        			}
	        			//else {
	        			//	System.out.println("Erreur dans la structure : "+nameGene+" "+lengthGene+" "+typeGene+" "+anticodonGene+" "+positionStartGene+" "+positionEndGene+" "+seqGene+" "+strGene);
	        			//}
	        			
/*	        			if (inputLine != null) {
	        				while (!inputLine.contains("Length")) {
	        					br.readLine();
	        				}
		        			if (!inputLine.equals("</PRE>") && inputLine.contains("Length")) {
			        			String firstLine[] = inputLine.split(" "); // première ligne
			        			if (firstLine.length>=3) {
				        			nameGene = firstLine[0]; // nom du génome
				        			lengthGene = firstLine[2]; // taille du génome
				        			//System.out.println(firstLine[0]+" "+firstLine[2]);
			        			}
			        			else {
		        					System.out.println("Problème dans la récupération des données au niveau de la première ligne "+inputLine);
		        				}
			        			
			        			inputLine = br.readLine();
			        			if (inputLine != null) {
			        				if (inputLine.contains("Type") && inputLine.contains("Anticodon")){
				        				String secondLine[] = inputLine.split(" "); // deuxième ligne
				        				if (secondLine.length>=5) {
					        				typeGene = secondLine[1].split("\t")[0]; // type du génome
					        				anticodonGene = secondLine[2]; // anticodon du génome
					        				String positionTab[] = secondLine[4].split("-");
					        				if (positionTab.length>=2) {
						        				positionStartGene = positionTab[0];
						        				positionEndGene = positionTab[1];
					        					System.out.println(secondLine[2]);
	
					        				}
					        				else {
					        					System.out.println("Problème dans la récupération des données au niveau de la position "+inputLine);
	
					        				}
				        				}
				        				else {
				        					System.out.println("Problème dans la récupération des données au niveau la deuxième ligne "+inputLine);
				        				}
				        				//System.out.println(positionStartGene+positionEndGene+" "+secondLine[4]+" "+secondLine[1].split("\t")[0]);
				        			}
			        			}
			        			
			        			inputLine = br.readLine();
			        			if (inputLine != null) {
			        				String thirdLine[] = inputLine.split(" "); // troisième ligne
			        				if (thirdLine.length>=2) {
				        				seqGene = thirdLine[1];
				        				//System.out.println(thirdLine[1]);
			        				}
			        				else {
			        					System.out.println("Problème dans la récupération des données au niveau la troisième ligne "+inputLine);
			        				}
			        			}
			        			
			        			inputLine = br.readLine();
			        			if (inputLine != null) {
			        				String fourthLine[] = inputLine.split(" ");
			        				if (fourthLine.length>=2) {
				        				strGene = fourthLine[1];
				        				//System.out.println(fourthLine[1]);
			        				}
			        				else {
			        					System.out.println("Problème dans la récupération des données au niveau la quatrième ligne "+inputLine);
			        				}

			        			}
			        			
			        			gene.add(new GeneStructure(nameGene, lengthGene, typeGene, anticodonGene, positionStartGene, positionEndGene, seqGene, strGene));
			        			//System.out.println(gene.size());
		        			}
	        			}*/
	        		}
	        	}     	
	        }
		}
		catch (Exception e) {
			e.printStackTrace();
			// TODO: handle exception
		}
    }

}
